#include "chapter02.h"
#include "text_utils.h"
#include "ColorSystem.h"
#include "Saver.h"
#include "Map.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <random>
#include <vector>
#include <string>

using namespace std;

// 第二章状态效果映射表
unordered_map<Chapter02Status, string> statusEffectNames = {
    {Chapter02Status::HALLUCINATION, "幻觉"},
    {Chapter02Status::FRAGILE_HEART, "脆弱的心"},
    {Chapter02Status::CRUEL, "残忍"},
    {Chapter02Status::RESPONSIBLE_HEART, "责任之心"},
    {Chapter02Status::GUILTY_HEART, "愧疚之心"},
    {Chapter02Status::EMPTY_HEART, "空洞之心"},
    {Chapter02Status::RADIATED, "辐射影响"}
};

// 道具ID到名称的映射
unordered_map<Chapter02ItemId, string> itemNames = {
    {Chapter02ItemId::BROKEN_COMPASS, "破碎的罗盘"},
    {Chapter02ItemId::ANCIENT_DAGGER, "古老匕首"},
    {Chapter02ItemId::HALLUCINOGENIC_MOSS, "致幻苔藓团块"},
    {Chapter02ItemId::INSULATING_GEL, "绝缘凝胶"},
    {Chapter02ItemId::WATCHMAN_EYE, "守夜人的焦黑眼珠"},
    {Chapter02ItemId::WATER_PURIFICATION_TABLETS, "压缩净水片"},
    {Chapter02ItemId::WORN_TOW_ROPE, "磨损的牵引索"},
    {Chapter02ItemId::LOW_FREQ_RESONATOR, "低频共鸣器"},
    {Chapter02ItemId::HIGH_PRESSURE_VALVE, "高压蒸汽阀芯"},
    {Chapter02ItemId::BAT_SKIN_PATCH, "修补用巨蝠皮膜"},
    {Chapter02ItemId::WAREHOUSE_MASTER_KEY, "飞艇库房主控钥匙"},
    {Chapter02ItemId::THICK_COOLANT, "浓稠冷却液"},
    {Chapter02ItemId::SONIC_DECOY, "声波诱饵"},
    {Chapter02ItemId::STRUCTURE_SCANNER, "结构扫描仪（残破）"},
    {Chapter02ItemId::EMERGENCY_REPAIR_KIT, "应急修补包"},
    {Chapter02ItemId::SIGNAL_GUN, "信号枪"},
    {Chapter02ItemId::SILENT_CORE, "寂静核心"},
    {Chapter02ItemId::DARK_CORE, "黑暗核心"}
};

// 检查属性值是否达标
bool checkStat(Player& player, int statValue, int target) {
    // 加入随机因素的检定系统
    int roll = rand() % 20 + 1;
    return (statValue + roll) >= target;
}

// 给玩家添加状态
void addChapter02Status(Player& player, Chapter02Status status, int level) {
    player.addStatusEffect(StatusEffect(static_cast<StatusEffect::Type>(status), level, 1));
}

// 检查玩家是否有需要的物品
bool hasRequiredItem(Player& player, Chapter02ItemId itemId) {
    //检查是否包含目标物品
    const auto& items = player.getInventory(); // 获取物品列表
    for (const auto& item : items) {
            return true;
    }
    return false;
}

// 玩家获得物品
void obtainChapter02Items(Player& player, int itemId) {
    // 将物品ID转换为Chapter02ItemId
    Chapter02ItemId chapterItemId = static_cast<Chapter02ItemId>(itemId);

    // 查找物品名称
    auto it = itemNames.find(chapterItemId);
    if (it == itemNames.end()) {
        cout << "获得了未知物品" << endl;
        return;
    }

    cout << "获得了物品：" << it->second << endl;
}

// 战斗函数实现
// 穹顶徘徊者战斗
bool battleWithDomeWanderers(Player& player) {
    // 创建穹顶徘徊者怪物对象
    Monster domeWanderer("穹顶徘徊者",
        player.getLevel() + 1,
        120, 30, 15, 18, 8,
        150); // 名称、等级、生命值、法力值、力量、敏捷、防御、经验奖励

    // 添加怪物技能
    domeWanderer.getSkills().emplace_back(
        "利爪挥击", "用锋利的爪子攻击敌人",
        15, 0, true,
        StatusEffect::BLEEDING, 30, 2
    );

    // 创建战斗实例
    Battle battle(&player, &domeWanderer);
    battle.startBattle();

    // 返回战斗结果（玩家胜利为true）
    return battle.getWinner() == &player;
}

// 锈蚀看守战斗
bool battleWithRustyGuard(Player& player) {
    Monster rustyGuard("锈蚀看守",
        player.getLevel() + 1,
        150, 40, 22, 12, 15,
        180);

    rustyGuard.getSkills().emplace_back(
        "重锤打击", "用锈蚀的重锤打击敌人",
        25, 5, true,
        StatusEffect::DEFENSE_BOOST, 0, 0 // 无附加效果，仅示例
    );
    rustyGuard.getSkills().emplace_back(
        "坚守", "提升自身防御",
        0, 10, false,
        StatusEffect::DEFENSE_BOOST, 100, 2
    );

    Battle battle(&player, &rustyGuard);
    battle.startBattle();
    return battle.getWinner() == &player;
}


// 锈蚀巨颚战斗
bool battleWithRustyJaw(Player& player) {
    Monster rustyJaw("锈蚀巨颚",
        player.getLevel() + 3,
        300, 20, 30, 10, 20,
        300);

    rustyJaw.getSkills().emplace_back(
        "巨颚撕咬", "用巨大的颚部撕咬敌人",
        40, 0, true,
        StatusEffect::BLEEDING, 60, 3
    );
    rustyJaw.getSkills().emplace_back(
        "震颤咆哮", "发出震耳欲聋的咆哮",
        15, 5, true,
        StatusEffect::STUNNED, 30, 1
    );

    Battle battle(&player, &rustyJaw);
    battle.startBattle();
    return battle.getWinner() == &player;
}

// 寂静掠食者战斗
bool battleWithSilentPredator(Player& player) {
    Monster silentPredator("寂静掠食者",
        player.getLevel() + 2,
        180, 50, 20, 25, 12,
        220);

    silentPredator.getSkills().emplace_back(
        "暗影突袭", "从阴影中发动突袭，造成额外伤害",
        25, 10, true,
        StatusEffect::STUNNED, 20, 1
    );
    silentPredator.getSkills().emplace_back(
        "精神干扰", "对目标造成精神冲击",
        10, 15, true,
        StatusEffect::SAN_LOSS, 40, 5
    );

    Battle battle(&player, &silentPredator);
    battle.startBattle();
    return battle.getWinner() == &player;
}

// 空洞守护者战斗
bool battleWithHollowGuardian(Player& player) {
    Monster hollowGuardian("空洞守护者",
        player.getLevel() + 4,
        400, 100, 28, 18, 25,
        450);

    hollowGuardian.getSkills().emplace_back(
        "虚空冲击", "释放虚空能量冲击敌人",
        35, 20, true,
        StatusEffect::SAN_LOSS, 50, 10
    );
    hollowGuardian.getSkills().emplace_back(
        "灵魂吸取", "吸取目标生命值",
        20, 15, true,
        StatusEffect::NONE, 100, 0 // 吸取效果在技能执行中实现
    );
    hollowGuardian.getSkills().emplace_back(
        "空洞领域", "召唤空洞领域增强自身",
        0, 30, false,
        StatusEffect::STRENGTH_BOOST, 100, 3
    );

    Battle battle(&player, &hollowGuardian);
    battle.startBattle();
    return battle.getWinner() == &player;
}

// 检查玩家是否有特定状态
bool hasChapter02Status(Player& player, Chapter02Status status, int minLevel) {
    // 假设Player类有获取状态列表的方法
    const auto& statuses = player.getStatusEffects();
    for (const auto& effect : statuses) {
        // 检查状态类型和等级
            return true;
    }
    return false;
}

// 初始化第二章
void initChapter02() {
    srand(time(nullptr));

    // 可以添加其他初始化逻辑，如加载第二章地图数据、设置初始事件等
    cout << "第二章环境初始化完成..." << endl;
}

// 显示第二章开场文本
void text2_01() {
    TextUtils::clearScreen();
    TextUtils::printWithDelay("第二章（第一部分）：寻觅苍穹之痕\n\n");

    TextUtils::printWithDelay("【章节开端】\n");
    TextUtils::printWithDelay("地海的崩溃仍在持续，沉闷的坍塌声从不远处传来，如同世界的心跳正在逐渐停止。");
    TextUtils::printWithDelay("查尔斯站在“岩心礁”边缘的悬崖上，抬头望向那压抑的、散发着微弱人工辉光的穹顶。");
    TextUtils::printWithDelay("根据古老的传说和安娜从破碎信息中解读的线索，通往地表的唯一可行路径并非向下，而是向上——隐藏在穹顶之上某个被遗忘的“天空空洞”中。");
    TextUtils::printWithDelay("要抵达那里，需要一件几乎被时代遗忘的造物：一艘原始的蒸汽热气球。\n\n");

    TextUtils::printWithDelay("查尔斯 （凝视上方，自言自语）：\n");
    TextUtils::printWithDelay("“热气球…莉莉如果知道要飞那么高，一定会吓得抱紧她的炮管吧。”\n\n");

    TextUtils::printWithDelay("【核心目标】\n");
    TextUtils::printWithDelay("探索“岩心礁”上层区域的旧时代飞艇库房，找到并修复足以抵达天空空洞的原始热气球。\n\n");

    TextUtils::pressAnyKeyToContinue();
}

// 处理第二章事件
GameState processChapter02Event(Player& player, Map& map, int eventType) {
    // 根据事件类型处理不同事件
    switch (eventType) {
    case 1:  // 发现新区域
        std::cout << "你发现了一个新的区域，空气中弥漫着铁锈和蒸汽的味道。\n";
        map.unlockArea(2);  // 假设解锁区域2
        break;
    case 2:  // 遭遇敌人
        std::cout << "突然，一个机械装置从阴影中出现，发出刺耳的噪音！\n";
        if (!battleWithSteamEruptor(player)) {
            return GameState::GAME_OVER;  // 战斗失败
        }
        break;
    case 3:  // 找到物品
        std::cout << "你在角落发现了一个闪闪发光的物品！\n";
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::HIGH_PRESSURE_VALVE));
        break;
    case 4:  // 遇到星期五
        std::cout << "你看到一个熟悉的身影在前方...是星期五！\n";
        interactWithFriday(player);
        break;
    default:
        std::cout << "发生了未知事件...\n";
    }
    return GameState::PLAYING;  // 继续游戏
}

// 处理第二章输入
GameState handleChapter02Input(Player& player, Map& map, char input) {
    switch (toupper(input)) {
    case 'W':  // 上移
        map.movePlayer(Map::Direction::UP);
        std::cout << "你向前移动了一步。\n";
        break;
    case 'S':  // 下移
        map.movePlayer(Map::Direction::DOWN);
        std::cout << "你向后移动了一步。\n";
        break;
    case 'A':  // 左移
        map.movePlayer(Map::Direction::LEFT);
        std::cout << "你向左移动了一步。\n";
        break;
    case 'D':  // 右移
        map.movePlayer(Map::Direction::RIGHT);
        std::cout << "你向右移动了一步。\n";
        break;
    case 'I':  // 查看物品
        player.showBag();  // 修改为使用Player类的showBag方法
        break;
    case 'H':  // 查看状态
        displayChapter02HUD(player);
        break;
    case 'Q':  // 退出游戏
        return GameState::QUIT;
    default:
        std::cout << "无效的输入，请重试。\n";
    }

    // 检查移动后是否触发事件
    int event = map.checkEventTrigger();
    if (event > 0) {
        return processChapter02Event(player, map, event);
    }

    return GameState::PLAYING;
}

// 迟暮回廊陷阱处理
bool handleTrapDuskCorridor(Player& player) {
    std::cout << "你踏入了迟暮回廊，周围的墙壁开始渗出腐蚀性液体！\n";

    // 检查玩家是否有防护物品
    if (hasRequiredItem(player, Chapter02ItemId::INSULATING_GEL)) {
        std::cout << "幸好你有绝缘凝胶，挡住了大部分腐蚀伤害！\n";
        player.takeDamage(5);  // 受到少量伤害
        return true;
    }

    // 没有防护物品，受到重创
    std::cout << "腐蚀性液体溅到了你身上，造成了严重伤害！\n";
    player.takeDamage(20);
    addChapter02Status(player, Chapter02Status::RADIATED, 2);

    return player.isAlive();
}

// 叠影之喉陷阱处理
bool handleTrapOverlappingLarynx(Player& player) {
    std::cout << "你进入了叠影之喉，周围出现了你的多个幻影！\n";

    // 检查玩家感知能力（使用敏捷属性）
    if (checkStat(player, player.getAgility(), 10)) {
        std::cout << "你凭借敏锐的直觉，分辨出了真实的道路！\n";
        return true;
    }

    // 感知不足，陷入幻觉
    std::cout << "幻影迷惑了你的感官，你感到一阵眩晕...\n";
    player.takeDamage(10);
    addChapter02Status(player, Chapter02Status::HALLUCINATION, 3);

    return player.isAlive();
}

// 悔过镜廊陷阱处理
bool handleTrapHallOfRecantation(Player& player) {
    std::cout << "你走进了悔过镜廊，墙上的镜子映照出你的内心愧疚...\n";

    // 检查玩家是否有愧疚之心状态
    if (hasChapter02Status(player, Chapter02Status::GUILTY_HEART)) {
        std::cout << "镜子放大了你的愧疚感，你感到心神不宁！\n";
        player.takeSanDamage(15);  // 理智受损
        return true;
    }

    // 没有愧疚之心，影响较小
    std::cout << "你内心坦荡，镜子对你几乎没有影响。\n";
    return true;
}

// 骨响地砖陷阱处理
bool handleTrapBoneChimeTiles(Player& player) {
    std::cout << "你踩在了骨响地砖上，发出了清脆的响声！\n";

    // 检查玩家是否有静音物品
    if (hasRequiredItem(player, Chapter02ItemId::SILENT_CORE)) {
        std::cout << "寂静核心吸收了声音，没有引起注意。\n";
        return true;
    }

    // 没有静音物品，可能引来敌人
    std::cout << "声音可能会引来附近的敌人！\n";
    // 50%概率触发战斗
    if (rand() % 2 == 0) {
        std::cout << "一群机械守卫被声音吸引过来了！\n";
        return battleWithRustyGuard(player);  // 假设已有此函数
    }

    return true;
}

// 与蒸汽喷涌者战斗
bool battleWithSteamEruptor(Player& player) {
    std::cout << "=== 遭遇蒸汽喷涌者 ===" << std::endl;
    std::cout << "一个巨大的蒸汽装置挡住了你的去路，它的阀门不断喷出高温蒸汽！\n";

    int eruptorHealth = 40;
    const int playerDamage = 10 + (player.getStrength() / 2);  // 基于力量的伤害

    while (eruptorHealth > 0 && player.isAlive()) {
        // 玩家回合
        std::cout << "\n你发起了攻击！";
        eruptorHealth -= playerDamage;
        std::cout << " 你对蒸汽喷涌者造成了" << playerDamage << "点伤害！\n";

        if (eruptorHealth <= 0) {
            break;
        }

        // 敌人回合
        std::cout << "蒸汽喷涌者向你喷出高温蒸汽！";
        int damage = rand() % 15 + 5;

        // 检查玩家是否有防护物品
        if (hasRequiredItem(player, Chapter02ItemId::THICK_COOLANT)) {
            damage /= 2;
            std::cout << " 你的浓稠冷却液减轻了伤害！";
        }

        player.takeDamage(damage);
        std::cout << " 你受到了" << damage << "点伤害！\n";

        // 显示状态
        std::cout << "蒸汽喷涌者剩余生命值: " << eruptorHealth << std::endl;
        std::cout << "你的剩余生命值: " << player.getCurrentHealth() << std::endl;  // 修改为使用getCurrentHealth()
    }

    if (player.isAlive()) {
        std::cout << "\n你成功摧毁了蒸汽喷涌者！\n";
        std::cout << "你获得了高压蒸汽阀芯！\n";
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::HIGH_PRESSURE_VALVE));
        return true;
    }
    else {
        std::cout << "\n你被蒸汽喷涌者击败了...\n";
        return false;
    }
}

// 与星期五对话交互
void interactWithFriday(Player& player) {
    std::cout << "\n=== 与星期五对话 ===" << std::endl;
    std::cout << "星期五: 查尔斯！真高兴还能见到你，我还以为你...\n";

    // 根据玩家状态显示不同对话
    if (hasChapter02Status(player, Chapter02Status::EMPTY_HEART)) {
        std::cout << "星期五: 你看起来不太对劲，你的眼神很空洞...发生了什么？\n";
        std::cout << "你无法回应，心中只有一片虚无。\n";
        removeChapter02Status(player, Chapter02Status::EMPTY_HEART);
        addChapter02Status(player, Chapter02Status::GUILTY_HEART, 1);
    }
    else if (hasChapter02Status(player, Chapter02Status::GUILTY_HEART)) {
        std::cout << "星期五: 我知道你对过去的事感到愧疚，但我们必须向前看。\n";
        std::cout << "星期五递给你一个物品: 拿着这个，也许能帮到你。\n";
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::EMERGENCY_REPAIR_KIT));
    }
    else {
        std::cout << "星期五: 我们得尽快离开这里，这个地方正在变得越来越危险。\n";
        std::cout << "星期五: 我找到了这个，也许对你有用。\n";
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::STRUCTURE_SCANNER));
    }

    std::cout << "星期五: 我会在前面的房间等你，小心点。\n";
    std::cout << "=== 对话结束 ===" << std::endl;
}

// 检查是否有第二章状态效果
bool hasChapter02Status(const Player& player, Chapter02Status status) {
    // 假设Player类有一个方法可以获取状态列表
    const auto& statuses = player.getStatusEffects();

    // 查找是否存在指定状态
    for (const auto& se : statuses) {
        if (se.type == static_cast<StatusEffect::Type>(status)) {
            return true;
        }
    }
    return false;
}

// 移除第二章状态效果
void removeChapter02Status(Player& player, Chapter02Status status) {
    // 遍历状态效果列表，移除指定类型的状态
    auto& statuses = player.getStatusEffects();
    auto it = std::remove_if(statuses.begin(), statuses.end(),
        [status](const StatusEffect& se) {
            return se.type == static_cast<StatusEffect::Type>(status);
        });

    if (it != statuses.end()) {
        StatusEffect removed = *it;
        statuses.erase(it, statuses.end());
        player.describeStatusEffect(removed, false);
    }
}

// 处理第二章状态效果
void processChapter02StatusEffects(Player& player) {
    // 处理幻觉状态
    if (hasChapter02Status(player, Chapter02Status::HALLUCINATION)) {
        std::cout << "【幻觉】你看到了不存在的事物，感到一阵混乱...\n";
        player.takeSanDamage(3);  // 每回合损失理智

        // 有概率解除幻觉
        if (rand() % 4 == 0) {
            removeChapter02Status(player, Chapter02Status::HALLUCINATION);
        }
    }

    // 处理辐射状态
    if (hasChapter02Status(player, Chapter02Status::RADIATED)) {
        std::cout << "【辐射影响】你的身体感到不适，能量在流失...\n";
        player.takeDamage(2);  // 每回合损失生命值
    }

    // 处理责任之心状态（正面效果）
    if (hasChapter02Status(player, Chapter02Status::RESPONSIBLE_HEART)) {
        std::cout << "【责任之心】你感到一股力量支撑着你，恢复了一些生命值。\n";
        player.heal(3);  // 每回合恢复生命
    }
}

// 显示第二章HUD
void displayChapter02HUD(const Player& player) {
    std::cout << "\n=== 状态信息 ===" << std::endl;
    std::cout << "生命值: " << player.getCurrentHealth() << "/" << player.getMaxHealth() << std::endl;  // 修改为使用新方法
    std::cout << "理智值: " << player.getSan() << "/" << player.getMaxSan() << std::endl;  // 修改为使用新方法
    std::cout << "力量: " << player.getStrength() << " 敏捷: " << player.getAgility() << std::endl;

    // 显示状态效果
    std::cout << "状态效果: ";
    bool hasAnyStatus = false;

    if (hasChapter02Status(player, Chapter02Status::HALLUCINATION)) {
        std::cout << "幻觉 ";
        hasAnyStatus = true;
    }
    if (hasChapter02Status(player, Chapter02Status::FRAGILE_HEART)) {
        std::cout << "脆弱的心 ";
        hasAnyStatus = true;
    }
    if (hasChapter02Status(player, Chapter02Status::RESPONSIBLE_HEART)) {
        std::cout << "责任之心 ";
        hasAnyStatus = true;
    }
    if (hasChapter02Status(player, Chapter02Status::GUILTY_HEART)) {
        std::cout << "愧疚之心 ";
        hasAnyStatus = true;
    }
    if (hasChapter02Status(player, Chapter02Status::EMPTY_HEART)) {
        std::cout << "空洞之心 ";
        hasAnyStatus = true;
    }
    if (hasChapter02Status(player, Chapter02Status::RADIATED)) {
        std::cout << "辐射影响 ";
        hasAnyStatus = true;
    }
    if (hasChapter02Status(player, Chapter02Status::DARK_AWARENESS)) {
        std::cout << "黑暗意识 ";
        hasAnyStatus = true;
    }

    if (!hasAnyStatus) {
        std::cout << "无";
    }
    std::cout << "\n=================\n" << std::endl;
}


// 运行第二章
void runChapter02(Player& player, Map& map) {
    initChapter02();
    text2_01();

    // 加载第二章地图
    if (!map.loadMapFromFile(2)) {
        TextUtils::printWithDelay("无法加载第二章地图！游戏将终止。");
        return;
    }

    // 设置玩家初始位置
    map.setPlayerPosition(5, 5); // 假设初始位置

    // 依次运行第二章的四个部分
    processAirshipWarehouse(player, map);
    processHollowCorridor(player, map);
    processShadowDance(player, map);
    processBlackCurtain(player, map);

    TextUtils::clearScreen();
    TextUtils::printWithDelay("第二章 完\n");
    TextUtils::pressAnyKeyToContinue();
}



// 第一部分：飞艇库房探索
void processAirshipWarehouse(Player& player, Map& map) {
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【飞艇库房探索】\n\n");

    // 初始进入
    TextUtils::printWithDelay("你来到了旧时代飞艇库房的入口，主大门被锁死，看来需要寻找其他入口。\n");
    TextUtils::printWithDelay("在侧面，你发现了一个破损的通风管道，似乎可以爬进去。\n");

    TextUtils::printWithDelay("是否进入通风管道？(y/n) ");
    char choice;
    cin >> choice;

    if (tolower(choice) != 'y') {
        TextUtils::printWithDelay("你决定寻找其他入口，但周围没有发现任何可行的路径。最终还是只能选择通风管道。\n");
    }

    TextUtils::printWithDelay("你爬进了通风管道，进入了库房的下层维护区。\n");
    TextUtils::pressAnyKeyToContinue();

    // 遭遇第一批穹顶徘徊者
    TextUtils::clearScreen();
    TextUtils::printWithDelay("突然，几只飞行生物从阴暗处飞出，向你发起攻击！它们是穹顶徘徊者！\n");
    TextUtils::pressAnyKeyToContinue();

    bool victory = battleWithDomeWanderers(player);
    if (!victory) {
        TextUtils::printWithDelay("你在与穹顶徘徊者的战斗中失败了...\n");
        // 处理失败逻辑，例如游戏结束或重新开始
        return;
    }

    TextUtils::printWithDelay("你成功击退了穹顶徘徊者！\n");
    TextUtils::printWithDelay("在打扫战场时，你发现了一个结构扫描仪（残破）。\n");
    obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::STRUCTURE_SCANNER));
    TextUtils::pressAnyKeyToContinue();

    // 使用结构扫描仪发现隐藏岔路
    TextUtils::clearScreen();
    TextUtils::printWithDelay("你使用结构扫描仪，发现通风管道内有一个隐藏的岔路。\n");
    TextUtils::printWithDelay("是否进入岔路？(y/n) ");
    cin >> choice;

    if (tolower(choice) == 'y') {
        TextUtils::printWithDelay("你进入了隐藏岔路，发现了一个小储藏室。\n");
        TextUtils::printWithDelay("在储藏室中，你找到了磨损的牵引索和声波诱饵。\n");
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::WORN_TOW_ROPE));
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::SONIC_DECOY));
    }
    else {
        TextUtils::printWithDelay("你决定继续前进，放弃了探索岔路的机会。\n");
    }
    TextUtils::pressAnyKeyToContinue();

    // 探索中层平台
    TextUtils::clearScreen();
    TextUtils::printWithDelay("你来到了库房的中层平台，前方有一道宽阔的裂谷阻挡了去路。\n");

    if (hasRequiredItem(player, Chapter02ItemId::WORN_TOW_ROPE)) {
        TextUtils::printWithDelay("你可以使用磨损的牵引索荡过裂谷。\n");
        TextUtils::printWithDelay("进行力量检定...\n");

        if (checkStat(player, player.getStrength(), 10)) {
            TextUtils::printWithDelay("检定成功！你成功荡过了裂谷。\n");
        }
        else {
            TextUtils::printWithDelay("检定失败！你差点掉进裂谷，幸好抓住了边缘爬了上来，但牵引索也因此损坏了。\n");
            // 移除牵引索
            // 这里需要实现从背包中移除物品的逻辑
        }
    }
    else {
        TextUtils::printWithDelay("你没有可以跨越裂谷的工具，必须寻找其他路径...\n");
        TextUtils::printWithDelay("经过一番探索，你找到了一条狭窄的栈道，艰难地绕过了裂谷。\n");
    }
    TextUtils::pressAnyKeyToContinue();

    // 启动备用电源
    TextUtils::clearScreen();
    TextUtils::printWithDelay("你来到一个控制台前，看来需要启动备用电源来恢复升降梯的运行。\n");
    TextUtils::printWithDelay("是否启动备用电源？(y/n) ");
    cin >> choice;

    if (tolower(choice) == 'y') {
        TextUtils::printWithDelay("你启动了备用电源，升降梯开始运行，但也发出了巨大的噪音。\n");
        TextUtils::printWithDelay("噪音吸引来了几只锈蚀看守！准备战斗！\n");
        TextUtils::pressAnyKeyToContinue();

        victory = battleWithRustyGuard(player);
        if (!victory) {
            TextUtils::printWithDelay("你在与锈蚀看守的战斗中失败了...\n");
            return;
        }

        TextUtils::printWithDelay("你成功击败了锈蚀看守！\n");
        TextUtils::printWithDelay("从它们身上，你找到了飞艇库房主控钥匙。\n");
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::WAREHOUSE_MASTER_KEY));
    }
    else {
        TextUtils::printWithDelay("你决定不启动电源，寻找其他方法...\n");
        TextUtils::printWithDelay("经过长时间的探索，你找到了一条废弃的楼梯，艰难地爬上了上层。\n");
    }
    TextUtils::pressAnyKeyToContinue();

    // 进入主库房
    TextUtils::clearScreen();
    if (hasRequiredItem(player, Chapter02ItemId::WAREHOUSE_MASTER_KEY)) {
        TextUtils::printWithDelay("你使用主控钥匙打开了通往主库房的大门。\n");
    }
    else {
        TextUtils::printWithDelay("你没有主控钥匙，只能尝试强行打开大门...\n");
        TextUtils::printWithDelay("进行力量检定...\n");

        if (checkStat(player, player.getStrength(), 15)) {
            TextUtils::printWithDelay("检定成功！你成功撞开了大门。\n");
        }
        else {
            TextUtils::printWithDelay("检定失败！你没能打开大门，只能寻找其他入口...\n");
            TextUtils::printWithDelay("经过一番努力，你找到了一个通风管道，爬进了主库房。\n");
        }
    }

    TextUtils::printWithDelay("主库房非常空旷，中央悬挂着那艘巨大的、破损严重的热气球。\n");
    TextUtils::printWithDelay("气囊上有数个破洞，吊篮的锅炉缺失关键部件。\n");
    TextUtils::pressAnyKeyToContinue();

    // 寻找热气球部件
    TextUtils::clearScreen();
    TextUtils::printWithDelay("你开始在主库房周围探索，寻找修复热气球需要的部件。\n");

    // 寻找高压蒸汽阀芯
    TextUtils::printWithDelay("你发现了一个老式保险箱，似乎里面有东西。\n");
    TextUtils::printWithDelay("进行智力检定破解保险箱...\n");

    if (checkStat(player, player.getWisdom(), 12)) {
        TextUtils::printWithDelay("检定成功！你成功破解了保险箱，找到了高压蒸汽阀芯。\n");
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::HIGH_PRESSURE_VALVE));
    }
    else {
        TextUtils::printWithDelay("检定失败！你无法破解保险箱...\n");
        TextUtils::printWithDelay("你决定强行打开它，进行力量检定...\n");

        if (checkStat(player, player.getStrength(), 18)) {
            TextUtils::printWithDelay("检定成功！你强行撬开了保险箱，找到了高压蒸汽阀芯。\n");
            obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::HIGH_PRESSURE_VALVE));
        }
        else {
            TextUtils::printWithDelay("检定失败！你没能打开保险箱，只能继续寻找其他线索。\n");
            TextUtils::printWithDelay("经过一番搜索，你在一个工作台上找到了高压蒸汽阀芯。\n");
            obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::HIGH_PRESSURE_VALVE));
        }
    }
    TextUtils::pressAnyKeyToContinue();

    // 寻找修补用巨蝠皮膜
    TextUtils::clearScreen();
    TextUtils::printWithDelay("你发现一堆坍塌的杂物后面似乎有一个洞穴。\n");
    TextUtils::printWithDelay("进行力量检定搬开杂物...\n");

    if (checkStat(player, player.getStrength(), 14)) {
        TextUtils::printWithDelay("检定成功！你搬开了杂物，露出了后面的洞穴。\n");
        TextUtils::printWithDelay("洞穴里栖息着巨大的温顺生物“穹顶巨蝠”。\n");

        TextUtils::printWithDelay("你打算怎么做？\n");
        TextUtils::printWithDelay("1. 杀死它获取皮膜\n");
        TextUtils::printWithDelay("2. 使用声波诱饵引开它，安全获取脱落的皮膜\n");
        TextUtils::printWithDelay("请选择: ");

        int choice;
        cin >> choice;

        if (choice == 1) {
            TextUtils::printWithDelay("你杀死了穹顶巨蝠，获得了修补用巨蝠皮膜。\n");
            obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::BAT_SKIN_PATCH));
            TextUtils::printWithDelay("但你感到一丝愧疚...\n");
            addChapter02Status(player, Chapter02Status::CRUEL, 1);
        }
        else if (choice == 2 && hasRequiredItem(player, Chapter02ItemId::SONIC_DECOY)) {
            TextUtils::printWithDelay("你使用声波诱饵成功引开了穹顶巨蝠，安全获取了脱落的皮膜。\n");
            obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::BAT_SKIN_PATCH));
        }
        else {
            TextUtils::printWithDelay("你没有声波诱饵，只能等待它离开...\n");
            TextUtils::printWithDelay("经过一段时间的等待，你终于获得了脱落的皮膜。\n");
            obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::BAT_SKIN_PATCH));
        }
    }
    else {
        TextUtils::printWithDelay("检定失败！你无法搬开杂物...\n");
        TextUtils::printWithDelay("你决定寻找其他方法，最终在一个储藏室里找到了修补用巨蝠皮膜。\n");
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::BAT_SKIN_PATCH));
    }
    TextUtils::pressAnyKeyToContinue();

    // 发现隐藏房间
    TextUtils::clearScreen();
    TextUtils::printWithDelay("在主库房一个不起眼的角落，你发现地面有奇怪的划痕。\n");
    TextUtils::printWithDelay("移动一个货架后，露出一个向下的隐藏楼梯。\n");
    TextUtils::printWithDelay("是否进入隐藏房间？(y/n) ");
    cin >> choice;

    if (tolower(choice) == 'y') {
        TextUtils::printWithDelay("你走下楼梯，发现这是一个前基金会观察站。\n");
        TextUtils::printWithDelay("在里面，你找到了浓稠冷却液和一份加密数据板。\n");
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::THICK_COOLANT));
        TextUtils::printWithDelay("日志显示他们早已知道天空空洞的存在，并将其标记为“异常点K-9”。\n");
        TextUtils::printWithDelay("日志提到“曙光一号的辐射泄漏是持续性的”，并记录了对“地海居民基因稳定性”的长期观察。\n");
    }
    else {
        TextUtils::printWithDelay("你决定不进入隐藏房间，继续专注于修复热气球。\n");
    }
    TextUtils::pressAnyKeyToContinue();

    // 修复热气球
    TextUtils::clearScreen();
    if (checkBalloonRepair(player)) {
        TextUtils::printWithDelay("你已经收集到了所有修复热气球需要的部件！\n");
        TextUtils::printWithDelay("将高压蒸汽阀芯安装进锅炉，用修补用巨蝠皮膜覆盖气囊的破洞。\n");
        TextUtils::printWithDelay("操作控制台，向锅炉注入燃料并点火。\n");
        TextUtils::printWithDelay("巨大的热气球缓缓鼓起，发出沉重的轰鸣声，逐渐升力将吊篮拉直。\n");
        TextUtils::printWithDelay("查尔斯跳进吊篮。热气球挣脱束缚，开始向着穹顶之上的黑暗缓缓上升。\n");
    }
    else {
        TextUtils::printWithDelay("你缺少修复热气球需要的关键部件...\n");
        TextUtils::printWithDelay("经过一番焦急的搜索，你终于找到了缺失的部件并完成了修复。\n");
        TextUtils::printWithDelay("热气球开始向着穹顶之上的黑暗缓缓上升。\n");
    }

    TextUtils::printWithDelay("\n【第一部分结束】\n");
    TextUtils::printWithDelay("热气球升入穹顶之上的未知空间，周围是冰冷的空气和扭曲的辐射云。\n");
    TextUtils::printWithDelay("查尔斯紧握控制杆，下方是逐渐远离的、濒临毁灭的地海世界，上方是隐藏着归家之路与残酷真相的“天空空洞”。\n");
    TextUtils::printWithDelay("旅程，才刚刚真正开始。\n");
    TextUtils::pressAnyKeyToContinue();
}

// 第二部分：空洞回廊遭遇战
void processHollowCorridor(Player& player, Map& map) {
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【空洞回廊的围猎】\n\n");

    TextUtils::printWithDelay("【章节开端】\n");
    TextUtils::printWithDelay("热气球挣脱地海穹顶的束缚，驶入一片光怪陆离的空域。\n");
    TextUtils::printWithDelay("这里并非预想中的星空，而是充斥着扭曲辐射极光与破碎物理法则的“空洞回廊”。\n");
    TextUtils::printWithDelay("巨大的、非自然的金属结构如同废弃的脚手架般悬浮其中，阻挡着去路。\n");
    TextUtils::printWithDelay("空气中弥漫着臭氧与某种生物性腐败混合的刺鼻气味。\n");
    TextUtils::printWithDelay("更令人不安的是，从四周的阴影与辐射云中，传来了清晰的、充满敌意的窸窣声与嘶吼——它们注意到了这个闯入者。\n\n");

    TextUtils::printWithDelay("查尔斯 （紧握控制杆，规避着一块缓慢旋转的金属残骸）：\n");
    TextUtils::printWithDelay("“看来‘欢迎委员会’的名单比我想象的要长。”\n\n");

    TextUtils::printWithDelay("【核心目标】\n");
    TextUtils::printWithDelay("操控热气球在危机四伏的空洞回廊中上升，抵御连续三波不同怪物的袭击，\n");
    TextUtils::printWithDelay("保护热气球的关键部件不被完全破坏，最终抵达空洞深处的相对安全区。\n\n");

    TextUtils::pressAnyKeyToContinue();

    // 飞行操控教学
    TextUtils::clearScreen();
    TextUtils::printWithDelay("你需要学习如何操控热气球在空洞回廊中穿行。\n");
    TextUtils::printWithDelay("注意规避辐射涌流和悬浮的金属残骸。\n");
    TextUtils::printWithDelay("前方出现了一片辐射涌流，需要及时规避！\n");
    TextUtils::printWithDelay("进行敏捷检定...\n");

    if (checkStat(player, player.getAgility(), 10)) {
        TextUtils::printWithDelay("检定成功！你成功规避了辐射涌流。\n");
    }
    else {
        TextUtils::printWithDelay("检定失败！你的热气球部分受到了辐射影响。\n");
        addChapter02Status(player, Chapter02Status::RADIATED, 3);
        player.takeSanDamage(5);  // 修改为使用takeSanDamage方法
        TextUtils::printWithDelay("你的SAN值下降了5点。\n");
    }
    TextUtils::pressAnyKeyToContinue();

    // 第一波袭击：穹顶徘徊者集群
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【第一波袭击：穹顶徘徊者集群】\n");
    TextUtils::printWithDelay("大量小型飞行怪物“穹顶徘徊者”集群袭来！\n");
    TextUtils::printWithDelay("它们单个伤害低，但数量多，会试图附着在气囊上缓慢降低耐久度。\n");
    TextUtils::pressAnyKeyToContinue();

    bool victory = battleWithDomeWanderers(player);
    if (!victory) {
        TextUtils::printWithDelay("你在与穹顶徘徊者集群的战斗中失败了...\n");
        return;
    }

    TextUtils::printWithDelay("你成功击退了第一波袭击！\n");
    TextUtils::printWithDelay("从消散的怪物群中，你找到了一些冷却液和一个应急修补包。\n");
    obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::THICK_COOLANT));
    obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::EMERGENCY_REPAIR_KIT));
    TextUtils::pressAnyKeyToContinue();

    // 平静期
    TextUtils::clearScreen();
    TextUtils::printWithDelay("战斗暂时平息，你发现了一个临时锚点，可以停靠休整。\n");
    TextUtils::printWithDelay("是否停靠？(y/n) ");
    char choice;
    cin >> choice;

    if (tolower(choice) == 'y') {
        TextUtils::printWithDelay("你停靠在临时锚点，进行了简单的修理和休整。\n");
        TextUtils::printWithDelay("热气球的耐久度有所恢复。\n");
        player.heal(20); // 恢复一些生命值
        TextUtils::printWithDelay("你的生命值恢复了20点。\n");
    }
    else {
        TextUtils::printWithDelay("你决定继续前进，不进行休整。\n");
    }
    TextUtils::pressAnyKeyToContinue();

    // 第二波袭击：锈蚀巨颚
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【第二波袭击：锈蚀巨颚】\n");
    TextUtils::printWithDelay("一只巨大的、如同漂浮螃蟹与挖掘机混合体的怪物“锈蚀巨颚”出现在前方！\n");
    TextUtils::printWithDelay("它移动缓慢，但会周期性发射能够瘫痪目标的锈蚀射线，并召唤少量穹顶徘徊者。\n");
    TextUtils::pressAnyKeyToContinue();

    victory = battleWithRustyJaw(player);
    if (!victory) {
        TextUtils::printWithDelay("你在与锈蚀巨颚的战斗中失败了...\n");
        return;
    }

    TextUtils::printWithDelay("你成功击败了锈蚀巨颚！\n");
    TextUtils::printWithDelay("从它的残骸中，你找到了高品质金属零件和锈蚀巨颚的甲壳。\n");
    TextUtils::printWithDelay("这些材料可以用于升级弩炮或修复热气球。\n");
    TextUtils::pressAnyKeyToContinue();

    // 第二次平静期
    TextUtils::clearScreen();
    TextUtils::printWithDelay("战斗结束后，你发现了一个充满资源的悬浮平台。\n");
    TextUtils::printWithDelay("你在上面找到了一些有用的物资，包括信号枪。\n");
    obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::SIGNAL_GUN));
    player.restoreMana(30); // 恢复一些法力值
    TextUtils::printWithDelay("你的法力值恢复了30点。\n");
    TextUtils::pressAnyKeyToContinue();

    // 第三波袭击：寂静掠食者
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【第三波袭击：寂静掠食者】\n");
    TextUtils::printWithDelay("一只几乎隐形、如幽灵鳐般的巨大生物“寂静掠食者”出现在周围！\n");
    TextUtils::printWithDelay("它不会直接攻击气球，而是会悄无声息地靠近，然后发动一次强大的EMP冲击。\n");
    TextUtils::printWithDelay("这会瞬间大幅降低气球耐久并禁用弩炮和部分控制系统。\n");
    TextUtils::pressAnyKeyToContinue();

    victory = battleWithSilentPredator(player);
    if (!victory) {
        TextUtils::printWithDelay("你在与寂静掠食者的战斗中失败了...\n");
        return;
    }

    TextUtils::printWithDelay("你成功击败了寂静掠食者！\n");
    TextUtils::printWithDelay("从它的残骸中，你找到了“寂静核心”和一个大型维修包。\n");
    obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::SILENT_CORE));
    TextUtils::printWithDelay("大型维修包大幅回复了热气球的耐久度。\n");
    TextUtils::pressAnyKeyToContinue();

    // 抵达安全区
    TextUtils::clearScreen();
    TextUtils::printWithDelay("击败所有敌人后，热气球终于穿越了最危险的区域，\n");
    TextUtils::printWithDelay("抵达一个巨大的、相对平静的悬浮废墟平台。\n");
    TextUtils::printWithDelay("气球严重受损，无法继续上升，迫降于此。\n\n");

    TextUtils::printWithDelay("【第二部分结束】\n");
    TextUtils::printWithDelay("查尔斯将破损的热气球固定在废墟平台上。\n");
    TextUtils::printWithDelay("眼前是更加奇异、仿佛由巨大生物遗骸和基金会科技混合构成的空洞深处。\n");
    TextUtils::printWithDelay("战斗的喧嚣已然过去，但一种更深沉的、被注视的寂静笼罩下来。\n");
    TextUtils::printWithDelay("在这里，他感知到了一股无比熟悉却又截然不同的气息——\n");
    TextUtils::printWithDelay("那是他遗失的人格碎片，与一种浩瀚、古老、温和的力量在一起。\n\n");

    TextUtils::printWithDelay("一个温暖而悲伤的声音（直接在查尔斯脑海中响起）：\n\n");
    TextUtils::printWithDelay("“你终于来了…另一个我。你带来了风暴与厮杀…但也带来了终结的答案。”\n");
    TextUtils::pressAnyKeyToContinue();
}

// 第三部分：与影共舞
void processShadowDance(Player& player, Map& map) {
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【与影共舞】\n\n");

    TextUtils::printWithDelay("【章节开端】\n");
    TextUtils::printWithDelay("热气球在巨大的悬浮废墟平台上剧烈颠簸后，终于停稳。\n");
    TextUtils::printWithDelay("查尔斯踏出吊篮，脚下的“地面”是一种温暖的、类似生物角质与金属融合的奇异物质。\n");
    TextUtils::printWithDelay("这里异常安静，只有远处辐射极光流动的微弱嗡鸣。\n");
    TextUtils::printWithDelay("空气中弥漫着一种难以言喻的宁静与悲伤。\n");
    TextUtils::printWithDelay("在这片废墟的中心，他看到了——另一个“自己”。\n\n");

    TextUtils::printWithDelay("那并非实体，而是一团柔和、不断流动的人形黑暗，轮廓与查尔斯依稀相似，却更加宁静、祥和。\n");
    TextUtils::printWithDelay("它正蹲伏着，用手掌般的黑暗轻抚着一只受伤的、发生变异的生物，那生物在它的触摸下变得温顺。\n");
    TextUtils::printWithDelay("这就是他遗失的人格碎片，与“黑暗”本身成为了好友的存在。它自称 “星期五”。\n\n");

    TextUtils::printWithDelay("星期五 （并未回头，声音直接传入查尔斯脑海，温暖而疲惫）：\n");
    TextUtils::printWithDelay("“你走过的路充满了硝烟和牺牲…我在这里都能感受到。另一个我。”\n\n");

    TextUtils::printWithDelay("【核心目标】\n");
    TextUtils::printWithDelay("与星期五进行对话与交互，通过一系列判定，说服它相信返回地海是必要之举，并自愿同行。\n\n");

    TextUtils::pressAnyKeyToContinue();

    // 环境探索
    TextUtils::clearScreen();
    TextUtils::printWithDelay("在与星期五深入交流前，你可以先探索一下这个悬浮平台。\n");
    TextUtils::printWithDelay("1. 调查黑暗之池\n");
    TextUtils::printWithDelay("2. 观察温顺的变异生物\n");
    TextUtils::printWithDelay("3. 研究破碎的纪念碑\n");
    TextUtils::printWithDelay("4. 直接与星期五对话\n");
    TextUtils::printWithDelay("请选择: ");

    int choice;
    cin >> choice;

    switch (choice) {
    case 1:
        TextUtils::printWithDelay("你来到黑暗之池边，这是一片平静的、镜面般的液态黑暗。\n");
        TextUtils::printWithDelay("在其中，你看到了一些地海正在发生的灾难片段（家人安危、海水上涨）。\n");
        TextUtils::printWithDelay("星期五的声音在你脑海中响起：“这是‘黑暗’感受到的悲伤。”\n");
        TextUtils::printWithDelay("你的紧迫感更加强烈了。\n");
        break;
    case 2:
        TextUtils::printWithDelay("你观察那些被星期五安抚的、原本凶猛的生物。\n");
        TextUtils::printWithDelay("它们看起来很温顺，对你也没有表现出攻击性。\n");
        TextUtils::printWithDelay("如果你表现出攻击性，可能会降低星期五的信任度。\n");
        break;
    case 3:
        TextUtils::printWithDelay("你研究了那块破碎的纪念碑，上面刻着模糊的标语：“观测点K-9。稳定性实验场。”\n");
        TextUtils::printWithDelay("进行智力检定解读更多信息...\n");

        if (checkStat(player, player.getWisdom(), 14)) {
            TextUtils::printWithDelay("检定成功！你解读出更多信息，暗示了地海的本质可能并非自然形成。\n");
        }
        else {
            TextUtils::printWithDelay("检定失败！你无法完全理解上面的信息，只能猜测这与基金会有关。\n");
        }
        break;
    case 4:
        TextUtils::printWithDelay("你决定直接与星期五对话。\n");
        break;
    default:
        TextUtils::printWithDelay("你漫无目的地四处走动，感受着这个奇异空间的宁静。\n");
    }
    TextUtils::pressAnyKeyToContinue();

    // 与星期五对话 - 第一阶段
    TextUtils::clearScreen();
    TextUtils::printWithDelay("星期五缓缓转过身，那团流动的黑暗中浮现出两点柔和的光芒，仿佛在注视着你。\n\n");

    TextUtils::printWithDelay("星期五：\n");
    TextUtils::printWithDelay("“你带着地海的沉重气息而来，查尔斯。那里的世界正在死亡，\n");
    TextUtils::printWithDelay("而你却要将我带回那个炼狱？”\n\n");

    TextUtils::printWithDelay("查尔斯：\n");
    TextUtils::printWithDelay("“那是我们的家。无论它变成什么样子，那里有需要我的人。”\n\n");

    TextUtils::printWithDelay("星期五轻轻晃动着，周围的空气泛起涟漪：\n");
    TextUtils::printWithDelay("“家？那个将我们撕裂、让你背负血腥与责任的地方？\n");
    TextUtils::printWithDelay("我在这里找到了真正的平静，与黑暗和谐共处，而非对抗。”\n\n");

    TextUtils::printWithDelay("请选择你的回应：\n");
    TextUtils::printWithDelay("1. “我需要你，完整的我们才能拯救地海”\n");
    TextUtils::printWithDelay("2. “平静？你只是在逃避！”\n");
    TextUtils::printWithDelay("3. “这里的宁静是虚假的，黑暗正在侵蚀一切”\n");
    TextUtils::printWithDelay("请选择: ");

    int response;
    cin >> response;
    int trustLevel = 0; // 用于跟踪星期五对玩家的信任度

    switch (response) {
    case 1:
        TextUtils::printWithDelay("\n查尔斯：“我一个人做不到。我们本是一体，只有合二为一，才能找到拯救地海的方法。”\n");
        TextUtils::printWithDelay("星期五沉默了片刻：“你的坦诚值得尊重，但理由还不够充分。”\n");
        trustLevel += 10;
        break;
    case 2:
        TextUtils::printWithDelay("\n查尔斯：“这不是平静，是逃避！我们的责任在下方，在那些正在死去的人身上！”\n");
        TextUtils::printWithDelay("星期五的轮廓变得不稳定：“责任？那正是将我们推向毁灭的枷锁！”\n");
        trustLevel -= 5;
        player.takeSanDamage(3);  // 修改为使用takeSanDamage方法
        TextUtils::printWithDelay("你的言语激怒了星期五，SAN值下降3点。\n");
        break;
    case 3:
        TextUtils::printWithDelay("\n查尔斯：“你真的认为这里是安全的吗？黑暗正在吞噬一切，包括这个地方。\n");
        TextUtils::printWithDelay("我们必须回去，找到根源，否则一切都将毁灭。”\n");
        TextUtils::printWithDelay("星期五：“你看到了多少？黑暗的本质，你又了解多少？”\n");
        if (checkStat(player, player.getWisdom(), 13)) {
            TextUtils::printWithDelay("你成功解读了星期五话语中的深意，进行了一次有说服力的回应。\n");
            trustLevel += 15;
        }
        else {
            TextUtils::printWithDelay("你的话语缺乏足够的洞察力，未能打动星期五。\n");
            trustLevel += 5;
        }
        break;
    default:
        TextUtils::printWithDelay("\n你犹豫不决，未能给出明确回应。\n");
        TextUtils::printWithDelay("星期五：“看来你自己也不确定这条路是否正确。”\n");
        break;
    }
    TextUtils::pressAnyKeyToContinue();

    // 与星期五对话 - 第二阶段：黑暗的本质
    TextUtils::clearScreen();
    TextUtils::printWithDelay("星期五缓缓飘向黑暗之池，波纹在它周围扩散：\n");
    TextUtils::printWithDelay("“你知道黑暗是什么吗？地海的人们恐惧它，对抗它，\n");
    TextUtils::printWithDelay("却从未想过与它共存。”\n\n");

    TextUtils::printWithDelay("黑暗之池的表面开始浮现影像——地海居民与变异生物战斗的画面，\n");
    TextUtils::printWithDelay("基金会实验的片段，以及查尔斯自己战斗的场景。\n\n");

    TextUtils::printWithDelay("星期五：“你看，这就是你们所谓的生存之道——毁灭与被毁灭。\n");
    TextUtils::printWithDelay("我留在这里，是因为我找到了另一条路。”\n\n");

    TextUtils::printWithDelay("请选择你的回应：\n");
    TextUtils::printWithDelay("1. “生存不是和谐，是责任”\n");
    TextUtils::printWithDelay("2. “展示给我，另一条路是什么样的”\n");
    TextUtils::printWithDelay("3. “黑暗正在杀死我的家人，我不能与它共存”\n");
    TextUtils::printWithDelay("请选择: ");

    cin >> response;

    switch (response) {
    case 1:
        TextUtils::printWithDelay("\n查尔斯：“和谐是奢侈品，当家园正在崩塌时，我们别无选择。\n");
        TextUtils::printWithDelay("责任不是枷锁，是我们之所以为人的原因。”\n");
        if (hasChapter02Status(player, Chapter02Status::RESPONSIBLE_HEART)) {
            TextUtils::printWithDelay("你的责任之心共鸣着，话语充满了力量。\n");
            TextUtils::printWithDelay("星期五的光芒闪烁了一下：“这颗心...承载了太多。”\n");
            trustLevel += 20;
        }
        else {
            TextUtils::printWithDelay("星期五：“你说的是责任，还是愧疚？”\n");
            trustLevel += 5;
        }
        break;
    case 2:
        TextUtils::printWithDelay("\n查尔斯：“如果你真的找到了另一条路，展示给我看。也许...我错了。”\n");
        TextUtils::printWithDelay("星期五沉默片刻，随后周围的温顺生物围拢过来。\n");
        TextUtils::printWithDelay("“它们曾是地海的噩梦，如今却是我的伙伴。黑暗没有改变它们，是视角改变了。”\n");
        TextUtils::printWithDelay("进行感知检定...\n");

        if (checkStat(player, player.getAgility(), 12)) {
            TextUtils::printWithDelay("检定成功！你注意到这些生物身上有辐射伤痕，是星期五在治愈它们。\n");
            TextUtils::printWithDelay("“你在治疗它们？”你问道。星期五点了点头：“黑暗可以毁灭，也可以修复。”\n");
            trustLevel += 15;
        }
        else {
            TextUtils::printWithDelay("检定失败！你只看到表面的温顺，未能理解深层含义。\n");
            trustLevel += 5;
        }
        break;
    case 3:
        TextUtils::printWithDelay("\n查尔斯：“当黑暗正在吞噬你的家人，你还能谈共存吗？\n");
        TextUtils::printWithDelay("我见过它的所作所为，那不是能与之和谐共处的存在！”\n");
        if (hasChapter02Status(player, Chapter02Status::RADIATED)) {
            TextUtils::printWithDelay("辐射影响让你的话语充满了恐惧与愤怒。\n");
            TextUtils::printWithDelay("星期五后退了一些：“你被它伤害过，所以无法理解。”\n");
            trustLevel -= 10;
            player.takeSanDamage(2);  // 修改为使用takeSanDamage方法
        }
        else {
            TextUtils::printWithDelay("星期五：“你的痛苦是真实的，但痛苦会扭曲认知。”\n");
            trustLevel += 10;
        }
        break;
    default:
        TextUtils::printWithDelay("\n你再次陷入沉默，内心充满矛盾。\n");
        TextUtils::printWithDelay("星期五：“看来你需要更多时间思考。”\n");
        break;
    }
    TextUtils::pressAnyKeyToContinue();

    // 与星期五对话 - 第三阶段：记忆的碎片
    TextUtils::clearScreen();
    TextUtils::printWithDelay("星期五突然伸出黑暗构成的手，触碰了你的额头。\n");
    TextUtils::printWithDelay("一瞬间，无数记忆碎片涌入你的脑海——\n");
    TextUtils::printWithDelay("童年的片段，与莉莉的初遇，基金会的实验记录，以及人格分裂的瞬间...\n\n");

    TextUtils::printWithDelay("星期五：“这就是我们分裂的原因。基金会的实验撕裂了我们，\n");
    TextUtils::printWithDelay("你带走了愤怒与责任，我则保留了平静与理解。”\n\n");

    TextUtils::printWithDelay("查尔斯 （捂着头，痛苦地）：\n");
    TextUtils::printWithDelay("“这些记忆...是真的吗？我们曾是基金会的实验体？”\n\n");

    TextUtils::printWithDelay("星期五：“地海的真相远比你想象的残酷。你们所谓的家园，\n");
    TextUtils::printWithDelay("从一开始就是一个巨大的实验场。你还要回去吗？”\n\n");

    TextUtils::printWithDelay("请选择你的回应：\n");
    TextUtils::printWithDelay("1. “正因为如此，我才必须回去揭露真相”\n");
    TextUtils::printWithDelay("2. “实验与否不重要，那里有我在乎的人”\n");
    TextUtils::printWithDelay("3. “你一直都知道这些？为什么不早点告诉我？”\n");
    TextUtils::printWithDelay("请选择: ");

    cin >> response;

    switch (response) {
    case 1:
        TextUtils::printWithDelay("\n查尔斯：“如果人们知道了真相，也许就能打破这个循环。\n");
        TextUtils::printWithDelay("这可能是拯救地海的唯一方法。”\n");
        if (hasRequiredItem(player, Chapter02ItemId::STRUCTURE_SCANNER)) {
            TextUtils::printWithDelay("你拿出结构扫描仪：“我已经发现了一些线索，需要你的帮助来解读。”\n");
            TextUtils::printWithDelay("星期五看着扫描仪：“基金会的技术...也许你真的能改变什么。”\n");
            trustLevel += 25;
        }
        else {
            TextUtils::printWithDelay("星期五：“真相往往比谎言更伤人。你确定人们准备好了吗？”\n");
            trustLevel += 10;
        }
        break;
    case 2:
        TextUtils::printWithDelay("\n查尔斯：“无论地海是什么，无论我们是谁，那里有我承诺要保护的人。\n");
        TextUtils::printWithDelay("这就足够了。”\n");
        TextUtils::printWithDelay("星期五的光芒柔和下来：“这就是你与我最大的不同——你能为爱牺牲。”\n");
        trustLevel += 20;
        if (hasChapter02Status(player, Chapter02Status::GUILTY_HEART)) {
            TextUtils::printWithDelay("你的愧疚之心让这份承诺更加沉重。\n");
            TextUtils::printWithDelay("“但愧疚驱动的牺牲，最终只会带来更多痛苦。”星期五补充道。\n");
        }
        break;
    case 3:
        TextUtils::printWithDelay("\n查尔斯：“这些记忆对我至关重要！你为什么一直隐瞒？”\n");
        TextUtils::printWithDelay("星期五的形态变得不稳定：“因为我知道这会让你痛苦！\n");
        TextUtils::printWithDelay("我一直在保护你，就像保护我自己一样！”\n");
        trustLevel -= 5;
        player.takeSanDamage(4);  // 修改为使用takeSanDamage方法
        TextUtils::printWithDelay("这段对话让你感到精神紧张，SAN值下降4点。\n");
        break;
    default:
        TextUtils::printWithDelay("\n你被这些真相震惊，无法做出回应。\n");
        TextUtils::printWithDelay("星期五：“我理解你的震惊。这需要时间消化。”\n");
        trustLevel += 5;
        break;
    }
    TextUtils::pressAnyKeyToContinue();

    // 最终决定
    TextUtils::clearScreen();
    TextUtils::printWithDelay("星期五静静地悬浮在你面前，周围的空气变得凝重：\n");
    TextUtils::printWithDelay("“我感受到了你的决心...也看到了你的矛盾。\n");
    TextUtils::printWithDelay("现在，我必须做出选择。”\n\n");

    if (trustLevel >= 30) {
        TextUtils::printWithDelay("星期五：“你的理由打动了我，另一个我。也许回去是必要的，\n");
        TextUtils::printWithDelay("不仅是为了拯救地海，也是为了我们能真正合二为一。”\n\n");

        TextUtils::printWithDelay("那团流动的黑暗缓缓靠近，融入你的身体。\n");
        TextUtils::printWithDelay("你感受到一股平静的力量在体内扩散，破碎的记忆开始整合。\n");
        TextUtils::printWithDelay("查尔斯 （感受着完整的自我）：“我...明白了。”\n\n");

        TextUtils::printWithDelay("你获得了新的领悟，解锁了“黑暗共鸣”能力！\n");
        TextUtils::printWithDelay("现在你可以与黑暗生物沟通，甚至暂时控制它们。\n");
        addChapter02Status(player, Chapter02Status::RESPONSIBLE_HEART, 1);
        player.increaseMaxSan(15);  // 修改为使用increaseMaxSan方法
        TextUtils::printWithDelay("你的最大SAN值增加了15点！\n");
    }
    else if (trustLevel >= 10) {
        TextUtils::printWithDelay("星期五：“我仍有疑虑，但你的信念值得尊重。我会跟你回去，\n");
        TextUtils::printWithDelay("但我保留自己的判断。”\n\n");

        TextUtils::printWithDelay("星期五化作一道黑影，缠绕在你的手臂上，形成一个黑暗印记。\n");
        TextUtils::printWithDelay("查尔斯：“这是...？”\n");
        TextUtils::printWithDelay("星期五的声音在你脑海中响起：“我们保持联系，但不完全融合。这样对我们都好。”\n\n");

        TextUtils::printWithDelay("你获得了“黑暗印记”能力，可以召唤星期五的部分力量。\n");
        player.restoreSan(5);  // 修改为使用restoreSan方法
        TextUtils::printWithDelay("你的SAN值恢复了5点。\n");
    }
    else {
        TextUtils::printWithDelay("星期五：“看来我们尚未准备好再次成为一体。你走吧，\n");
        TextUtils::printWithDelay("带着你的责任与痛苦。也许有一天，当你真正理解黑暗时...”\n\n");

        TextUtils::printWithDelay("星期五缓缓后退，融入黑暗之池，消失不见。\n");
        TextUtils::printWithDelay("查尔斯：“等等！”\n\n");

        TextUtils::printWithDelay("你未能说服星期五同行，但在它消失的地方，留下了一块“黑暗核心”。\n");
        obtainChapter02Items(player, static_cast<int>(Chapter02ItemId::DARK_CORE));
        TextUtils::printWithDelay("你获得了黑暗核心，似乎蕴含着某种神秘力量。\n");
        addChapter02Status(player, Chapter02Status::EMPTY_HEART, 1);
        player.takeSanDamage(10);  // 修改为使用takeSanDamage方法
        TextUtils::printWithDelay("你的SAN值下降了10点。\n");
    }

    TextUtils::pressAnyKeyToContinue();

    // 第三部分结束
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【第三部分结束】\n\n");

    if (trustLevel >= 10) {
        TextUtils::printWithDelay("随着星期五的决定，悬浮平台开始轻微震动。\n");
        TextUtils::printWithDelay("远处传来金属扭曲的声音，一个巨大的阴影正在接近。\n");
        TextUtils::printWithDelay("星期五的声音在你脑海中响起：“看来我们的对话引起了‘它’的注意。\n");
        TextUtils::printWithDelay("那是空洞的守护者，也是我们离开这里的最后障碍。”\n");
    }
    else {
        TextUtils::printWithDelay("在星期五消失后，整个悬浮平台开始剧烈摇晃。\n");
        TextUtils::printWithDelay("黑暗之池沸腾起来，一个巨大的阴影从其中升起，遮蔽了辐射极光。\n");
        TextUtils::printWithDelay("查尔斯 （握紧武器）：“看来我必须独自面对这个东西了。”\n");
    }

    TextUtils::printWithDelay("无论如何，最终的挑战已经到来。只有战胜前方的存在，\n");
    TextUtils::printWithDelay("才能继续前往天空空洞的核心，揭开地海与基金会的最终秘密。\n");
    TextUtils::pressAnyKeyToContinue();
}

// 第四部分：黑幕之后
void processBlackCurtain(Player& player, Map& map) {
    // 此处将实现与空洞守护者的最终战斗
    // 以及第二章的结局剧情
    TextUtils::clearScreen();
    TextUtils::printWithDelay("【黑幕之后】\n\n");

    TextUtils::printWithDelay("巨大的阴影逐渐清晰，显露出它的真实形态——\n");
    TextUtils::printWithDelay("那是一个由扭曲金属、生物组织和纯粹黑暗能量构成的恐怖造物，\n");
    TextUtils::printWithDelay("无数发光的眼睛分布在它多节的身体上，注视着你的一举一动。\n\n");

    TextUtils::printWithDelay("这就是空洞守护者，天空空洞的终极防御机制，\n");
    TextUtils::printWithDelay("也是阻止你前进的最后障碍。\n\n");

    TextUtils::printWithDelay("查尔斯 （准备战斗姿态）：\n");
    TextUtils::printWithDelay("“无论你是什么，都不能阻止我前进的脚步。”\n\n");

    TextUtils::pressAnyKeyToContinue();

    // 与空洞守护者的战斗将在这里实现
    bool victory = battleWithHollowGuardian(player);
    if (!victory) {
        TextUtils::printWithDelay("你在与空洞守护者的战斗中失败了...\n");
        TextUtils::printWithDelay("意识消散的最后一刻，你看到黑暗之池再次泛起涟漪...\n");
        return;
    }

    // 战斗胜利后的剧情
    TextUtils::clearScreen();
    TextUtils::printWithDelay("随着空洞守护者的消散，天空空洞的核心区域展现在你面前。\n");
    TextUtils::printWithDelay("那是一个巨大的、漂浮的基金会前哨站残骸，\n");
    TextUtils::printWithDelay("中央耸立着一座闪烁着奇异光芒的尖塔。\n\n");

    TextUtils::printWithDelay("查尔斯 （望向尖塔）：\n");
    TextUtils::printWithDelay("“那里...一定有我要找的答案。”\n\n");

    TextUtils::printWithDelay("当你靠近尖塔时，一道全息投影突然激活，显示出一位穿着基金会制服的老者。\n\n");

    TextUtils::printWithDelay("全息投影：\n");
    TextUtils::printWithDelay("“如果你看到这段记录，说明‘观测点K-9’的最终实验已经失败。\n");
    TextUtils::printWithDelay("地海的崩溃只是时间问题，而‘天空空洞’也即将关闭。\n");
    TextUtils::printWithDelay("我们试图控制黑暗能量的实验创造了你们——具有适应能力的新人类。\n");
    TextUtils::printWithDelay("查尔斯，你和星期五是我们最成功也最失败的作品。”\n\n");

    TextUtils::printWithDelay("投影闪烁了一下，继续说道：\n");
    TextUtils::printWithDelay("“通往地表的通道仍在运作，但它需要巨大的能量才能开启。\n");
    TextUtils::printWithDelay("黑暗核心或寂静核心都可以作为钥匙，但代价是...\n");
    TextUtils::printWithDelay("使用黑暗核心会永久改变你，而使用寂静核心则会摧毁这个空间。”\n\n");

    TextUtils::printWithDelay("请选择你的决定：\n");
    TextUtils::printWithDelay("1. 使用黑暗核心，接受永久改变\n");
    TextUtils::printWithDelay("2. 使用寂静核心，摧毁天空空洞\n");
    TextUtils::printWithDelay("请选择: ");

    int choice;
    cin >> choice;

    if (choice == 1 && hasRequiredItem(player, Chapter02ItemId::DARK_CORE)) {
        TextUtils::printWithDelay("\n你将黑暗核心插入控制台，一股强大的能量流过你的身体。\n");
        TextUtils::printWithDelay("你感受到自己与黑暗能量的联系变得前所未有的强烈，\n");
        TextUtils::printWithDelay("视野中出现了无数信息流，那是地海与天空空洞的连接网络。\n");
        TextUtils::printWithDelay("“这就是...完整的真相。”你喃喃自语。\n");
        TextUtils::printWithDelay("通往地表的通道缓缓打开，散发着柔和的光芒。\n");
        addChapter02Status(player, Chapter02Status::DARK_AWARENESS, 1);
    }
    else if (choice == 2 && hasRequiredItem(player, Chapter02ItemId::SILENT_CORE)) {
        TextUtils::printWithDelay("\n你将寂静核心放入能量插槽，它立刻开始吸收周围的黑暗能量。\n");
        TextUtils::printWithDelay("整个天空空洞开始剧烈震动，结构变得不稳定。\n");
        TextUtils::printWithDelay("“这样做也许是错的，但为了地海，我别无选择。”\n");
        TextUtils::printWithDelay("一道通往地表的临时通道在你面前打开，但周围的结构正在崩塌。\n");
        TextUtils::printWithDelay("“快走！没有时间了！”星期五的声音在你脑海中响起（无论之前是否同行）。\n");
    }
    else {
        TextUtils::printWithDelay("\n你没有所需的核心，只能寻找其他方法...\n");
        TextUtils::printWithDelay("经过一番努力，你找到了一个紧急出口，但它只能单向通行且不稳定。\n");
        TextUtils::printWithDelay("“这可能是唯一的机会了。”你深吸一口气，跳入了闪烁的能量场中。\n");
    }

    TextUtils::printWithDelay("\n【第二章 全部结束】\n");
    TextUtils::printWithDelay("你穿过通道，感受到强烈的眩晕感。\n");
    TextUtils::printWithDelay("当意识恢复时，你发现自己躺在一片陌生的土地上——\n");
    TextUtils::printWithDelay("清新的空气，绿色的植物，以及上方那片你从未见过的、广阔无垠的蓝色天空。\n");
    TextUtils::printWithDelay("你终于来到了地表。\n\n");

    TextUtils::printWithDelay("但旅程并未结束。远处传来熟悉的机械运转声，\n");
    TextUtils::printWithDelay("地平线上出现了基金会主基地的轮廓。\n");
    TextUtils::printWithDelay("那里，有所有问题的最终答案，也有最艰难的挑战在等待着你。\n");
    TextUtils::pressAnyKeyToContinue();
}

// 检查热气球是否可以修复
bool checkBalloonRepair(Player& player) {
    return hasRequiredItem(player, Chapter02ItemId::HIGH_PRESSURE_VALVE) &&
        hasRequiredItem(player, Chapter02ItemId::BAT_SKIN_PATCH) &&
        hasRequiredItem(player, Chapter02ItemId::THICK_COOLANT);
}


